home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / sword2.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  5KB  |  215 lines

  1. /* 剣みたいに長い敵 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12. #include "../entry.h"
  13.  
  14.  
  15. #define PALET_MAIN    0x0300
  16.  
  17. #define HP_0    400
  18.  
  19. #define ENTRY_CONTROL_ADD    10    /* entry_control に足す値 */
  20.  
  21. enum {
  22.     APPEAR_LEFT = 0, APPEAR_RIGHT
  23. };
  24.  
  25. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  26.  
  27. static short EnemyMoveSword2 (ENEMY *);
  28. static void EnemyTiniSword2 (ENEMY *);
  29.  
  30.  
  31. void EnemyInitSword2 (ENEMY * p)
  32. {
  33.     if (SHORT_LX < 144) {
  34.         p->cwork = APPEAR_LEFT;
  35.         p->vx = 65536;
  36.     } else {
  37.         p->cwork = APPEAR_RIGHT;
  38.         p->vx = -65536;
  39.     }
  40.     p->vy = -16384;
  41.     p->hit_px = 28;
  42.     p->hit_py = 16;
  43.     p->hit_sx = 48;
  44.     p->hit_sy = 16;
  45.     p->hit_cx = 6;
  46.     p->damage = 0;
  47.     p->flash = 0;
  48.     p->hp = HP_0;
  49.     p->pt = obj_sword;
  50.     p->seq = 0;
  51.     p->m_work = 0;
  52.     p->s_work = 0;
  53.     p->core_pt = sp_core01;
  54.     p->func_enemy_move = EnemyMoveSword2;
  55.     p->func_enemy_tini = EnemyTiniSword2;
  56.  
  57.     entry_control += ENTRY_CONTROL_ADD;
  58. }
  59.  
  60.  
  61.  
  62. static short EnemyMoveSword2 (ENEMY * p)
  63. {
  64.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  65.     p->x = (p->lx += p->vx) >> 16;
  66.     p->y = (p->ly += p->vy) >> 16;
  67.  
  68.     switch (p->seq) {
  69.  
  70.     case 0:
  71.         if (p->m_work++ > 150) {
  72.             if (p->cwork == APPEAR_LEFT) {
  73.                 if ((p->vx -= 2048) <= 0)
  74.                     p->seq++;
  75.             } else {
  76.                 if ((p->vx += 2048) >= 0)
  77.                     p->seq++;
  78.             }
  79.         }
  80.         /* 攻撃処理 */
  81. #define INTERVAL0_1    14
  82. #define SPEED_SHOT0_1    16
  83.         if (p->s_work++ > INTERVAL0_1) {
  84.             p->s_work = 0;
  85.             EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT0_1, 64, 0);
  86.             SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  87.         }
  88.         break;
  89.  
  90.     case 1:
  91.         if (p->vy < 16384) {
  92.             p->vy += 2048;
  93.         } else {
  94.             p->seq++;
  95.         }
  96.         break;
  97.  
  98.         /* カバー開く */
  99.     case 2:
  100.         p->pt++;
  101.         if (p->pt >= obj_sword + 24) {    /* カバー開ききったら */
  102.             p->seq++;
  103.             p->s_work = p->s_work2 = p->s_work3 = 0;
  104.         }
  105.         break;
  106.  
  107.     case 3:
  108.         /* 攻撃処理 */
  109.  
  110.         /* なぎ倒し弾 */
  111.         switch (p->s_work2++) {
  112. #define INTERVAL1_1    20
  113. #define SPEED_SHOT1_1    10
  114.         case INTERVAL1_1 * 1:
  115.             p->s_angle = psearch (p->x - 16, p->y) - 2;    /* 自機の方向をサーチ */
  116.             p->s_angle2 = psearch (p->x + 16, p->y) + 2;    /* 自機の方向をサーチ */
  117.         case INTERVAL1_1 * 2:
  118.         case INTERVAL1_1 * 3:
  119.         case INTERVAL1_1 * 4:
  120.             EshotInit (ESHOT_NRG02, p->x - 16, p->y + 1, SPEED_SHOT1_1, p->s_angle, 0);
  121.             EshotInit (ESHOT_NRG02, p->x + 16, p->y + 1, SPEED_SHOT1_1, p->s_angle2, 0);
  122.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  123.             break;
  124.         case INTERVAL1_1 * 7:
  125.             p->s_work2 = 0;
  126.             break;
  127.         }
  128.  
  129.         /* 3方向弾 */
  130. #define INTERVAL1_2    25
  131. #define SPEED_SHOT1_2    8
  132.         switch (p->s_work3++) {
  133.         case INTERVAL1_2 * 1:
  134.             {
  135.                 char a = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  136.                 EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT1_2, a, 0);
  137.                 EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT1_2, a + 24, 0);
  138.                 EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT1_2, a - 24, 0);
  139.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  140.             }
  141.             break;
  142.         case INTERVAL1_2 * 6:
  143.             p->s_work3 = 0;
  144.             break;
  145.         }
  146.  
  147.         if (SHORT_LY > 192)
  148.             p->seq++;
  149.         break;
  150.  
  151.         /* 撤退 */
  152.     case 4:
  153.         if (SHORT_VY < 1)
  154.             p->vy += 4096;
  155.         /* 画面外に出たら消去 */
  156.         if (SHORT_LY > 256 + 64 + 16)
  157.             return (-1);    /* 消去 */
  158.         break;
  159.     }
  160.  
  161.     /* 自機ショットに当たった時の処理 */
  162.     if (p->damage) {
  163.         if (p->damage_core) {
  164.             SoundSetSE (SE_CORE_DAMAGE);
  165.             p->info = PALET_RED | PRIORITY_BOSS;
  166.             p->damage_core = 0;
  167.         } else {
  168.             SoundSetSE (SE_DAMAGE);
  169.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  170.         }
  171.         if ((p->hp -= p->damage) <= 0) {
  172.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  173.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  174.             if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS))
  175.                 EffectInit (EFFECT_POINTS_RED, POINTS_2000, p->x, p->y);
  176.             else
  177.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_1000, p->x, p->y);
  178.             if (disp_level == DISP_LEVEL_HIGH)
  179.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  180.             return (-1);    /* 消去 */
  181.         }
  182.         p->damage = 0;
  183.         p->flash = TIMER_FLASH_DAMAGE;
  184.     } else {
  185.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 100)) {
  186.             p->info = PALET_RED | PRIORITY_BOSS;
  187.             if (p->flash > TIMER_FLASH_NORMAL)
  188.                 p->flash = 0;
  189.         } else {
  190.             p->info = PALET_MAIN | PRIORITY_BOSS;
  191.         }
  192.     }
  193.     xobj_set_st (p);
  194.  
  195.     /* コアの表示 */
  196.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  197.     p->core_y = p->y - 8;
  198.  
  199.     /* 自機のすぐ前にいると赤 */
  200.     if (wabs (player->x - p->x) <= 8)
  201.         p->core_info = PALET_CORE_RED | PRIORITY_BOSS;
  202.     else
  203.         p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  204.     xsp_set_st (&(p->core_x));
  205.  
  206.     return (0);
  207. }
  208.  
  209.  
  210.  
  211. static void EnemyTiniSword2 (ENEMY * p)
  212. {
  213.     entry_control -= ENTRY_CONTROL_ADD;
  214. }
  215.